#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
图片批量重命名脚本
功能：将ready目录下各子目录中的图片重命名为"目录名-序号.扩展名"格式

作者：AI助手
创建时间：2025-01-22
"""

import os
import sys
from pathlib import Path
import shutil
from typing import List, Tuple

class ImageRenamer:
    """图片重命名工具类"""
    
    def __init__(self, base_dir: str = "ready"):
        """
        初始化重命名工具
        
        Args:
            base_dir: 基础目录，默认为"ready"
        """
        self.base_dir = Path(base_dir)
        # 支持的图片格式
        self.image_extensions = {
            '.jpg', '.jpeg', '.png', '.gif', '.bmp', 
            '.webp', '.tiff', '.tif', '.ico', '.svg'
        }
        
    def is_image_file(self, file_path: Path) -> bool:
        """
        判断文件是否为图片文件
        
        Args:
            file_path: 文件路径
            
        Returns:
            bool: 是否为图片文件
        """
        return file_path.suffix.lower() in self.image_extensions
    
    def get_image_files(self, directory: Path) -> List[Path]:
        """
        获取目录下的所有图片文件
        
        Args:
            directory: 目录路径
            
        Returns:
            List[Path]: 图片文件列表
        """
        image_files = []
        try:
            for file_path in directory.iterdir():
                if file_path.is_file() and self.is_image_file(file_path):
                    image_files.append(file_path)
        except PermissionError:
            print(f"⚠️ 无权限访问目录: {directory}")
        except Exception as e:
            print(f"❌ 读取目录失败 {directory}: {e}")
            
        # 按文件名排序，确保重命名的一致性
        return sorted(image_files)
    
    def rename_images_in_directory(self, directory: Path) -> Tuple[int, int]:
        """
        重命名指定目录下的所有图片
        
        Args:
            directory: 目录路径
            
        Returns:
            Tuple[int, int]: (成功数量, 失败数量)
        """
        if not directory.is_dir():
            print(f"❌ 不是有效目录: {directory}")
            return 0, 0
            
        # 获取目录名作为前缀
        dir_name = directory.name
        print(f"\n📁 处理目录: {dir_name}")
        
        # 获取所有图片文件
        image_files = self.get_image_files(directory)
        
        if not image_files:
            print(f"   ℹ️ 目录中没有找到图片文件")
            return 0, 0
            
        print(f"   📸 找到 {len(image_files)} 个图片文件")
        
        success_count = 0
        fail_count = 0
        
        # 重命名每个图片文件
        for index, old_path in enumerate(image_files, 1):
            try:
                # 获取文件扩展名
                extension = old_path.suffix.lower()
                
                # 生成新文件名
                new_filename = f"{dir_name}-{index}{extension}"
                new_path = directory / new_filename
                
                # 检查新文件名是否已存在
                if new_path.exists() and new_path != old_path:
                    print(f"   ⚠️ 目标文件已存在，跳过: {new_filename}")
                    fail_count += 1
                    continue
                
                # 如果新旧文件名相同，跳过
                if new_path == old_path:
                    print(f"   ✅ 文件名已正确: {new_filename}")
                    success_count += 1
                    continue
                
                # 执行重命名
                old_path.rename(new_path)
                print(f"   ✅ {old_path.name} → {new_filename}")
                success_count += 1
                
            except Exception as e:
                print(f"   ❌ 重命名失败 {old_path.name}: {e}")
                fail_count += 1
                
        return success_count, fail_count
    
    def process_all_directories(self) -> None:
        """
        处理base_dir下的所有子目录
        """
        if not self.base_dir.exists():
            print(f"❌ 基础目录不存在: {self.base_dir}")
            return
            
        if not self.base_dir.is_dir():
            print(f"❌ 路径不是目录: {self.base_dir}")
            return
            
        print(f"🚀 开始处理目录: {self.base_dir.absolute()}")
        print("=" * 60)
        
        total_success = 0
        total_fail = 0
        processed_dirs = 0
        
        try:
            # 遍历所有子目录
            subdirs = [d for d in self.base_dir.iterdir() if d.is_dir()]
            
            if not subdirs:
                print("ℹ️ 没有找到子目录")
                return
                
            for subdir in sorted(subdirs):
                success, fail = self.rename_images_in_directory(subdir)
                total_success += success
                total_fail += fail
                if success > 0 or fail > 0:
                    processed_dirs += 1
                    
        except PermissionError:
            print(f"❌ 无权限访问目录: {self.base_dir}")
            return
        except Exception as e:
            print(f"❌ 处理过程中发生错误: {e}")
            return
            
        # 输出统计结果
        print("\n" + "=" * 60)
        print("📊 处理完成统计:")
        print(f"   📁 处理的目录数: {processed_dirs}")
        print(f"   ✅ 成功重命名: {total_success} 个文件")
        print(f"   ❌ 失败数量: {total_fail} 个文件")
        
        if total_success > 0:
            print("🎉 批量重命名完成！")
        else:
            print("ℹ️ 没有文件被重命名")

def main():
    """主函数"""
    print("🖼️ 图片批量重命名工具")
    print("功能：将ready目录下各子目录中的图片重命名为'目录名-序号.扩展名'格式")
    print()
    
    # 检查命令行参数
    base_dir = "ready"
    if len(sys.argv) > 1:
        base_dir = sys.argv[1]
        print(f"📂 使用指定目录: {base_dir}")
    else:
        print(f"📂 使用默认目录: {base_dir}")
        print("💡 提示: 可以通过命令行参数指定其他目录，如: python image_rename.py /path/to/directory")
    
    print()
    
    # 创建重命名工具并执行
    renamer = ImageRenamer(base_dir)
    renamer.process_all_directories()

if __name__ == "__main__":
    main()
